package com.sy.socket.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.UUID;

/**
 * UDP提供者，用于提供服务
 */
public class UDPProvider {

    public static void main(String[] args) throws IOException {
        String sn = UUID.randomUUID().toString();  // 生成唯一标识
        Provider provider = new Provider(sn);
        provider.start();

        // 读取键盘任意字符就退出
        System.in.read();
        provider.exit();
    }

    private static class Provider extends Thread{
        private final String sn;
        private boolean done = false;
        private DatagramSocket ds = null;  // 定义好UDP协议的socket，用来接收数据

        public Provider(String sn){
            super();
            this.sn = sn;
        }

        @Override
        public void run() {
            super.run();

            System.out.println("UDPProvider starts");

            try {
                // UDP的socket监听20000端口
                ds = new DatagramSocket(20000);

                while (!done) {
                    // 接受者，指定20000端口用户数据接收

                    // 接收实体
                    final byte[] buf = new byte[512];
                    DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);

                    System.out.println("等待数据中");
                    // 接收数据
                    ds.receive(datagramPacket);

                    // 打印接收到的信息和发送者的信息
                    // 发送者的ip地址
                    String ip = datagramPacket.getAddress().getHostAddress();
                    // 发送者的端口
                    int port = datagramPacket.getPort();
                    // 发送的数据长度
                    int dataLen = datagramPacket.getLength();
                    String data = new String(datagramPacket.getData(), 0, dataLen);

                    System.out.println("UDPProvider receive from ip：" + ip
                            + "\tport：" + port + "\tdata：" + data);

                    // 解析端口号  也就是不使用发送者原本的那个端口号
                    int respPort = MessageCreator.parsePort(data);
                    if (respPort != -1) {  // 是符合我们规定的传输要求的
                        // 构建回送数据
                        String respData = MessageCreator.buildWithSn(sn);
                        byte[] respDataBytes = respData.getBytes();
                        // 根据发送者的信息回送信息
                        DatagramPacket respPacket = new DatagramPacket(respDataBytes,
                                respDataBytes.length,
                                datagramPacket.getAddress(),
                                respPort);

                        ds.send(respPacket);
                    }


                }
            } catch (Exception ignored) {
            } finally {
                close();
            }

            // 完成
            System.out.println("UDPProvider Finished");

        }

        private void close() {
            if (ds != null) {
                ds.close();
                ds = null;
            }
        }

        /**
         * 结束方法
         */
        void exit() {
            done = true;
            close();
        }
    }
}
